package cl.gob.minvu.catastromobile;

import com.google.gson.Gson;

import cl.gob.minvu.catastromobile.entities.Ficha;
import cl.gob.minvu.catastromobile.entities.GrupoPrincipal;
import cl.gob.minvu.catastromobile.util.GenericUtil;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;

/**
 * @author psep
 * 
 */
public class AntViviendaActivity extends AbstractActivity {

	private Spinner subsidio;
	private Spinner condicionOcupacion;
	private EditText menores;
	private EditText adultos;
	private EditText mayores;
	private EditText discapacitados;
	private EditText totalFamilia;
	private Spinner lugarTemporal;
	private GrupoPrincipal mainGroup;
	private boolean moradores;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_ant_vivienda);
		super.session = super.getSharedPreferences(GenericUtil.SESSION,
				MODE_PRIVATE);
		this.subsidio = (Spinner) super
				.findViewById(R.id.spinnerAccesoVivienda);
		this.condicionOcupacion = (Spinner) super
				.findViewById(R.id.spinnerOcupacionVivienda);
		this.menores = (EditText) super
				.findViewById(R.id.editTextMenoresVivienda);
		this.adultos = (EditText) super
				.findViewById(R.id.editTextAdultosVivienda);
		this.mayores = (EditText) super
				.findViewById(R.id.editTextMayoresVivienda);
		this.discapacitados = (EditText) super
				.findViewById(R.id.editTextDiscapacidadVivienda);
		this.totalFamilia = (EditText) super
				.findViewById(R.id.editTextTotalFamiliaVivienda);
		this.lugarTemporal = (Spinner) super
				.findViewById(R.id.spinnerLugarTransVivienda);
		this.onchangeImpl();
		this.onLoadSession();
		this.validaMoradores();
	}

	/**
	 * Método que valida mediante el objeto de sesión de moradores si es SI o
	 * NO. Siendo este último bloquea los campos del formulario.
	 */
	private void validaMoradores() {
		String fichaJson = super.session.getString(GenericUtil.FICHA, null);

		if (fichaJson != null) {
			Gson gson = new Gson();
			Ficha ficha = gson.fromJson(fichaJson, Ficha.class);

			if (ficha.moradores < 2) {
				this.moradores = true;
			} else {
				this.moradores = false;
				this.subsidio.setSelection(0);
				this.condicionOcupacion.setSelection(0);
				this.menores.setText("0");
				this.adultos.setText("0");
				this.mayores.setText("0");
				this.discapacitados.setText("0");
				this.totalFamilia.setText("0");
				this.lugarTemporal.setSelection(0);
			}

			this.subsidio.setEnabled(this.moradores);
			this.condicionOcupacion.setEnabled(this.moradores);
			this.menores.setEnabled(this.moradores);
			this.adultos.setEnabled(this.moradores);
			this.mayores.setEnabled(this.moradores);
			this.discapacitados.setEnabled(this.moradores);
			this.lugarTemporal.setEnabled(this.moradores);
		}
	}

	/**
	 * Método que valida si existe un objeto en sesión desplegándolo en el
	 * formulario.
	 */
	private void onLoadSession() {
		String mainGroupJson = super.session.getString(GenericUtil.GRUPO_PRINCIPAL, null);

		if (mainGroupJson != null) {
			Gson gson = new Gson();
			this.mainGroup = gson.fromJson(mainGroupJson, GrupoPrincipal.class);
			this.loadTextFrm();
		}
	}

	/**
	 * Método que carga el objeto (si no es nulo) en el formulario.
	 */
	private void loadTextFrm() {
		if (this.mainGroup != null) {
			this.subsidio.setSelection(this.mainGroup.subsidio);
			this.condicionOcupacion
					.setSelection(this.mainGroup.condicionOcupacion);
			this.menores.setText(String.valueOf(this.mainGroup.menores));
			this.adultos.setText(String.valueOf(this.mainGroup.adultos));
			this.mayores.setText(String.valueOf(this.mainGroup.mayores));
			this.discapacitados.setText(String
					.valueOf(this.mainGroup.discapacitados));
			this.totalFamilia.setText(String
					.valueOf(this.mainGroup.totalFamilia));
			this.lugarTemporal.setSelection(this.mainGroup.lugarTemporal);
		}
	}

	/**
	 * Método que sobre escribe las clases de textview para implementar un
	 * método que detecte la acción onchange y ejecute la suma de campos.
	 */
	private void onchangeImpl() {
		this.menores.addTextChangedListener(new TextWatcher() {

			public void afterTextChanged(Editable s) {
				getTotalGrupo();
			}

			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
			}
		});

		this.adultos.addTextChangedListener(new TextWatcher() {

			public void afterTextChanged(Editable s) {
				getTotalGrupo();
			}

			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
			}
		});

		this.mayores.addTextChangedListener(new TextWatcher() {

			public void afterTextChanged(Editable s) {
				getTotalGrupo();
			}

			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
			}
		});

		this.discapacitados.addTextChangedListener(new TextWatcher() {

			public void afterTextChanged(Editable s) {
				getTotalGrupo();
			}

			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
			}
		});
	}

	/**
	 * Método que suma el valor de los campos de textview y los carga en el
	 * campo de totales.
	 */
	private void getTotalGrupo() {
		int menores = GenericUtil.stringToInt(super
				.getStringEditText(this.menores));
		int adultos = GenericUtil.stringToInt(super
				.getStringEditText(this.adultos));
		int mayores = GenericUtil.stringToInt(super
				.getStringEditText(this.mayores));
		int discapacitados = GenericUtil.stringToInt(super
				.getStringEditText(this.discapacitados));

		int total = menores + adultos + mayores + discapacitados;
		this.totalFamilia.setText(String.valueOf(total));
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.ant_vivienda, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();

		switch (id) {
		case R.id.grupoFamiliar_frm_descartar:
			this.reset();
			return true;

		case R.id.grupoFamiliar_frm_atras:
			super.go(AntViviendaEncDirActivity.class);
			finish();
			return true;

		default:
			return super.onOptionsItemSelected(item);
		}

	}

	/**
	 * Método que carga los valores del formulario en el objeto de
	 * GrupoPrincipal
	 */
	private void loadGrupoPrincipal() {
		this.mainGroup = new GrupoPrincipal();
		this.mainGroup.subsidio = super.getIdSpinner(this.subsidio);
		this.mainGroup.condicionOcupacion = super
				.getIdSpinner(this.condicionOcupacion);
		this.mainGroup.menores = GenericUtil.stringToInt(super
				.getStringEditText(this.menores));
		this.mainGroup.adultos = GenericUtil.stringToInt(super
				.getStringEditText(this.adultos));
		this.mainGroup.mayores = GenericUtil.stringToInt(super
				.getStringEditText(this.mayores));
		this.mainGroup.discapacitados = GenericUtil.stringToInt(super
				.getStringEditText(this.discapacitados));
		this.mainGroup.totalFamilia = GenericUtil.stringToInt(super
				.getStringEditText(this.totalFamilia));
		this.mainGroup.lugarTemporal = super.getIdSpinner(this.lugarTemporal);
	}

	/**
	 * Método que registra la acción del accionar del botón guardar
	 * 
	 * @param button
	 */
	public void onClickGuardar(View button) {
		if (this.validateFrm()) {
			this.loadGrupoPrincipal();

			Gson gson = new Gson();
			String serializable = gson.toJson(this.mainGroup);
			Editor edit = super.session.edit();
			edit.putString(GenericUtil.GRUPO_PRINCIPAL, serializable);
			edit.commit();

			super.go(FormActivity.class);
			finish();
		}
	}

	@Override
	public void reset() {
		this.mainGroup = null;
		Editor edit = super.session.edit();
		edit.remove(GenericUtil.GRUPO_PRINCIPAL);
		edit.commit();
		this.subsidio.setSelection(0);
		this.condicionOcupacion.setSelection(0);
		this.menores.setText("");
		this.adultos.setText("");
		this.mayores.setText("");
		this.discapacitados.setText("");
		this.totalFamilia.setText("");
		this.lugarTemporal.setSelection(0);
	}

	@Override
	public boolean validateFrm() {
		if (!this.moradores) {
			return true;
		} else {
			int validador = 0;

			if (super.getIdSpinner(this.condicionOcupacion) == 0) {
				super.toastMsg("Debe seleccionar Condición de Ocupación de la Vivienda");
				validador = validador + 1;
			}

			if (super.getStringEditText(this.menores).length() == 0) {
				this.menores
						.setError("Debe ingresar la cantidad de menores del Grupo Familiar");
				validador = validador + 1;
			}

			if (super.getStringEditText(this.adultos).length() == 0) {
				this.adultos
						.setError("Debe ingresar la cantidad de adultos del Grupo Familiar");
				validador = validador + 1;
			}

			if (super.getStringEditText(this.mayores).length() == 0) {
				this.mayores
						.setError("Debe ingresar la cantidad de adultos mayores del Grupo Familiar");
				validador = validador + 1;
			}

			if (super.getStringEditText(this.discapacitados).length() == 0) {
				this.discapacitados
						.setError("Debe ingresar la cantidad de personas con requerimientos especiales del Grupo Familiar");
				validador = validador + 1;
			}

			if (validador == 0) {
				return true;
			} else {
				return false;
			}

		}
	}
}
